/**
 * @class SafeString
 * @param { string } value
 * @param { number } min_len 字符串最小长度
 * @param { number } max_len 字符串最大长度
 * @description 自封装的安全 string类型
 * @method trim 去除字符串中前后空白字符
 * @method normalize 去除字符串中前后空白字符并将字符串中非前后空白字符转为一个空格
 * @method removeAllSpaces 去除字符串中所有空白字符
 * @method checkLength 检查字符串长度
 * @throws { TypeError }
 */
class SafeString {
    constructor(value, min_len, max_len) {
        // 类型验证
        value = String(value ?? '');
        if (typeof value !== 'string') {
            throw new TypeError(`Expected string, got ${typeof value}`);
        }
        // 最小长度验证
        if (min_len && value.length < min_len) {
            throw new RangeError(`Expected string length to be at least ${min_len}, got ${value.length}`);
        }
        // 最大长度验证
        if (max_len && value.length > max_len) {
            throw new RangeError(`Expected string length to be at most ${max_len}, got ${value.length}`);
        }
        this.value = value;
    }

    /**
     * 去除字符串中前后空白字符
     * @returns { SafeString } 返回一个新的 SafeString 实例
     */
    trim() {
        return new SafeString(this.value.trim());
    }

    /**
     * 去除字符串中前后空白字符并将字符串中非前后空白字符转为一个空格
     * @returns { SafeString } 返回一个新的 SafeString 实例
     */
    normalize() {
        return new SafeString(this.value.trim().replace(/\s+/g, ' '));
    }

    /**
     * 去除字符串中所有空白字符
     * @returns { SafeString } 返回一个新的 SafeString 实例
     */
    removeAllSpaces() {
        return new SafeString(this.value.replace(/\s+/g, ''));
    }

    /**
     * 检查字符串长度
     * @param { number } min_len 最小长度
     * @param { number } max_len 最大长度
     * @returns { boolean }
     */
    checkLength(min_len, max_len) {
        return this.value.length >= min_len && this.value.length <= max_len;
    }
}

module.exports = SafeString;